一句话,有了协程,你的异步程序看起来就像同步代码一样。
V:View,关注处理视图的可视化及与用户交互
P:Presenter,关注业务处理
###在MVP模式里通常包含4个要素:
(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
###总结:
V:持有P的引用,项目规格不大,可以不使用P的接口
P:持有M、V的接口实现对象
**Note:**
防止Activity或Fragment声明周期结束后,一般执行耗时操作的Presenter层因为持有对Activity或Fragment的强引用,导致内存泄漏。
**处理方法:**
1. 解除绑定关系,在V层生命周期的OnDestory()中,调用P层持有的V,将其置空,解除和P层的关联。
2. 为了弥补在特殊情况下,如系统突然回收内存,导致Activity的onStop、onDestory没有执行便被干掉,造成上一种方式解除绑定代码没有被执行,特还需要使用软引用或弱引用。
/**
* code from Android源码设计模式
*/
public abstract class BasePresenter<T> {
protected Reference<T> mViewRef;
public void attachView(T view) {
mViewRef = new WeakReference<T>(view);
}
protected T getView() {
return mViewRef.get();
}
protected void detachView() {
if (mViewRef != null) {
mViewRef.clear();
mViewRef = null;
}
}
}
public abstract class MVPBaseActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {
BasePresenter mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = createPresenter();
mPresenter.attachView((V) this);
}
public abstract T createPresenter();
@Override
public void onDestroy() {
mPresenter.detachView();
}
}